package com.course.controller.admin;

import com.course.dto.PageBean;
import com.course.dto.StuDTO;
import com.course.dto.StuUpdateDTO;
import com.course.dto.updatePassword;
import com.course.entity.Result;
import com.course.entity.SC;
import com.course.entity.Student;
import com.course.server.StuService;
import com.course.vo.ChooseCourse;
import com.course.vo.CourseList;
import com.course.vo.StudentCredit;
import com.course.vo.StudentsCourse;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

@Slf4j
@RestController("adminStuController")
@CrossOrigin
@RequestMapping("/admin/stu")
@Tag(name = "管理端-学生接口",description = "学生管理")
public class StuController {
    @Autowired
    private StuService stuService;

    /**
     * 新增学生
     * @param stuDTO
     * @return
     */
    @PostMapping
    public Result add(@RequestBody StuDTO stuDTO){
        //记录日志
        log.info("新增学生:{}",stuDTO.getSname());
        //调用service
        stuService.addstu(stuDTO);
        return Result.sucess();
    }

    /**
     * 根据学号查询学生信息
     * @return
     */
    @GetMapping("/{sno}")
    public Result list(@PathVariable Integer sno){
        log.info("根据学号查询学生数据");
        List<Student> studentList=stuService.list2(sno);
        return Result.sucess(studentList);
    }

    /**
     * 根据学号删除学生信息
     * @param sno
     * @return
     */
    @DeleteMapping("/{sno}")
    public Result delete(@PathVariable Integer sno){
        //记录日志
        log.info("根据学号删除学生");
        //调用service层功能
        stuService.delete(sno);
        //返回结果给前端
        return Result.sucess();
    }

    /**
     * 分页查询
     * @param page
     * @param pageSize
     * @param sno
     * @param sname
     * @return
     */
    @GetMapping("/page")
    public Result page(@RequestParam(defaultValue = "1")Integer page,
                       @RequestParam(defaultValue = "10")Integer pageSize, Integer sno, String sname){
        //记录日志
        log.info("分页查询,{},{},{},{}",page,pageSize,sno,sname);
        //调用service层分页查询
        PageBean pageBean=stuService.page(page,pageSize,sno,sname);
        //返回结果给前端
        return Result.sucess(pageBean);
    }

    /**
     * 更新学生信息
     * @param student
     * @return
     */
    @PutMapping
    public Result update(@RequestBody Student student){
        log.info("更新学生信息:{}",student);
        stuService.Updatestu(student);
        return Result.sucess();
    }

    /**
     * 获取学生学分信息
     * @return
     */
    @GetMapping("/stuCredit/{sno}")
    public Result studentCredit(@PathVariable Integer sno){
        log.info("获取学生学分信息");
        List<StudentCredit> studentCredits=stuService.studentCredit(sno);
        return Result.sucess(studentCredits);
    }

    /**
     * 进行选课
     * @param chooseCourse
     * @return
     */
    @PutMapping("/choose")
    public Result ChooseCourse(@RequestBody ChooseCourse chooseCourse){
        log.info("学生进行选课:{}",chooseCourse);
        stuService.ChooseCourse(chooseCourse);
        return Result.sucess();
    }

    /**
     * 查询已经选修了的课程
     * @param sno
     * @return
     */
    @GetMapping("/course/{sno}")
    public Result GetCourse(@PathVariable Integer sno){
        log.info("查询学生选修的课程:{}",sno);
        List<StudentsCourse> GetCourse=stuService.GetCourse(sno);
        return Result.sucess(GetCourse);
    }

    /**
     * 更新学生成绩
     * @return
     */
    @PutMapping("/updateGrade")
    public Result updateGrade(@RequestBody SC sc){
        log.info("更新学生某门课程的成绩",sc);
        stuService.updateGrade(sc);
        return Result.sucess();
    }

    /**
     * 管理员一键修改密码
     * @param sno
     * @return
     */
    @PutMapping("/updatePassword/{sno}")
    public Result updatePassword(@PathVariable Integer sno){
        log.info("更新学生的密码:{}",sno);
        stuService.updatePassword(sno);
        return Result.sucess();
    }

    /**
     * 学生自定义修改密码
     * @param toupdatePassword
     * @return
     */
    @PutMapping("/definePassword")
    public Result definePassword(@RequestBody updatePassword toupdatePassword){
        log.info("学生自定义修改密码：{}",toupdatePassword);
        stuService.definePassword(toupdatePassword);
        return Result.sucess();
    }
}
